From 992c4d6f0bee1d82b9ca160a49e163ff0fa396cb Mon Sep 17 00:00:00 2001 From: "tw275@labyrinth.cl.cam.ac.uk" Date: Mon, 16 Aug 2004 13:04:39 +0000 Subject: [PATCH] bitkeeper revision 1.1159.32.1 (4120b0e7LRYrL1B3ICa0Qkit5txAbQ) Added error checking, small button on domain list, updated to be compatible with latest xend, and some small changes to domain creation. --- .rootkeys | 4 ++ tools/python/xen/sv/CreateDomain.py | 21 ++++++++-- tools/python/xen/sv/DomInfo.py | 61 ++++++++++++++++++++-------- tools/python/xen/sv/DomList.py | 49 +++++++++++++++------- tools/python/xen/sv/HTMLBase.py | 2 + tools/python/xen/sv/Main.py | 25 +++++++++++- tools/python/xen/sv/NodeInfo.py | 15 +++++-- tools/python/xen/sv/util.py | 8 +++- tools/sv/Makefile | 5 +++ tools/sv/images/destroy.png | Bin 0 -> 2408 bytes tools/sv/images/small-destroy.png | Bin 0 -> 483 bytes tools/sv/images/small-pause.png | Bin 0 -> 434 bytes tools/sv/images/small-unpause.png | Bin 0 -> 500 bytes tools/sv/inc/script.js | 7 ++++ 14 files changed, 153 insertions(+), 44 deletions(-) create mode 100644 tools/sv/images/destroy.png create mode 100644 tools/sv/images/small-destroy.png create mode 100644 tools/sv/images/small-pause.png create mode 100644 tools/sv/images/small-unpause.png diff --git a/.rootkeys b/.rootkeys index 6c0a76071c..a98b088629 100644 --- a/.rootkeys +++ b/.rootkeys @@ -442,6 +442,7 @@ 40cf2937Z8WCNOnO2FcWdubvEAF9QQ tools/python/xen/xm/shutdown.py 40fcefb2K1xqVVT4D-p7nL2GzS4scg tools/sv/Main.rpy 40ffbcb66Dj5F-1kCK9BcgSqCWkt1w tools/sv/Makefile +4120b0e5L_nW-u0MWRfIdXg4ng4OjA tools/sv/images/destroy.png 4107c921_OR9NTSv2dKFiLCXxrXoxA tools/sv/images/finish.png 40fcefb3wXQMsl9WkgQAVtdrupm4sw tools/sv/images/left-end-highlight.jpg 40fcefb3K6ESt5sQhD9aCQRscQIlXQ tools/sv/images/left-end-no-highlight.jpg @@ -459,6 +460,9 @@ 40fcefb3dgsa24WLk_BJeYQHrDLuOg tools/sv/images/seperator-right-highlight.jpg 40fcefb3FtiX4Pd2kT8wDlp8u8xRhQ tools/sv/images/seperator.jpg 41013a82sUdUqBv8EoAUJii3gsZ-4g tools/sv/images/shutdown.png +4120b0e5RyNoIQNMjUs4A2kshovjaQ tools/sv/images/small-destroy.png +4120b0e6vW66wW6WvjQyFD0AZH2tng tools/sv/images/small-pause.png +4120b0e6USof7ieyGxEvtCdTMpxaQw tools/sv/images/small-unpause.png 4104ffca-jPHLVOrW0n0VghEXXtKxg tools/sv/images/unpause.png 40fcefb3yMSrZvApO9ToIi-iQwnchA tools/sv/images/xen.png 41013a83z27rKvWIxAfUBMVZ1eDCDg tools/sv/inc/script.js diff --git a/tools/python/xen/sv/CreateDomain.py b/tools/python/xen/sv/CreateDomain.py index b4fd52f0e8..77237a3a47 100644 --- a/tools/python/xen/sv/CreateDomain.py +++ b/tools/python/xen/sv/CreateDomain.py @@ -25,6 +25,7 @@ class CreatePage0( Sheet ): self.addControl( InputControl( 'name', 'VM Name', 'VM Name:', "[\\w|\\S]+", "You must enter a name in this field" ) ) self.addControl( InputControl( 'memory', '64', 'Memory (Mb):', "[\\d]+", "You must enter a number in this field" ) ) self.addControl( InputControl( 'cpu', '0', 'CPU:', "[\\d]+", "You must enter a number in this feild" ) ) + self.addControl( InputControl( 'cpu_weight', '1', 'CPU Weight:', "[\\d]+", "You must enter a number in this feild" ) ) class CreatePage1( Sheet ): @@ -83,9 +84,16 @@ class CreateFinish( Sheet ): xend_sxp = self.translate_sxp( string2sxp( self.passback ) ) - dom_sxp = server.xend_domain_create( xend_sxp ) + try: + dom_sxp = server.xend_domain_create( xend_sxp ) + success = "Your domain was successfully created.\n" + except: + success = "There was an error creating your domain.\nThe configuration used is as follows:\n" + dom_sxp = xend_sxp + + - pt = PreTab( sxp2prettystring( dom_sxp ) ) + pt = PreTab( success + sxp2prettystring( dom_sxp ) ) pt.write_BODY( request ) request.write( "

" % self.passback ) @@ -106,6 +114,7 @@ class CreateFinish( Sheet ): vals.name = get( 'name' ) vals.memory = get( 'memory' ) vals.cpu = get( 'cpu' ) + vals.cpu_weight = get( 'cpu_weight' ) vals.builder = get( 'builder' ) vals.kernel = get( 'kernel' ) @@ -121,7 +130,7 @@ class CreateFinish( Sheet ): vals.disk = vbds - #misc crap + #misc vals.pci = [] @@ -145,4 +154,8 @@ class CreateFinish( Sheet ): vals.cmdline_ip = "%s:%s:%s:%s:%s:eth0:%s" % (ip, nfs, gate, mask, host, dhcp) - return make_config( vals ) + try: + return make_config( vals ) + except: + return [["Error creating domain config."]] + diff --git a/tools/python/xen/sv/DomInfo.py b/tools/python/xen/sv/DomInfo.py index 6f8ac1ab5b..3e4fb70b13 100755 --- a/tools/python/xen/sv/DomInfo.py +++ b/tools/python/xen/sv/DomInfo.py @@ -5,6 +5,8 @@ from xen.sv.HTMLBase import HTMLBase from xen.sv.util import * from xen.sv.GenTabbed import * +DEBUG=1 + class DomInfo( GenTabbed ): def __init__( self, urlWriter ): @@ -76,8 +78,11 @@ class DomSXPTab( PreTab ): request.write( "

Please Select a Domain

" ) return None - domInfo = server.xend_domain( self.dom ) - + try: + domInfo = server.xend_domain( self.dom ) + except: + domInfo = [["Error getting domain details."]] + self.source = sxp2prettystring( domInfo ) PreTab.write_BODY( self, request ) @@ -88,32 +93,54 @@ class DomActionTab( ActionTab ): actions = { "shutdown" : ( "Shutdown the Domain", "shutdown.png" ), "reboot" : ( "Reboot the Domain", "reboot.png" ), "pause" : ( "Pause the Domain", "pause.png" ), - "unpause" : ( "Unpause the Domain", "unpause.png" ) } + "unpause" : ( "Unpause the Domain", "unpause.png" ), + "destroy" : ( "Destroy the Domain", "destroy.png" ) } ActionTab.__init__( self, actions ) def op_shutdown( self, request ): dom = getVar( 'dom', request ) - if not dom is None: - print ">DomShutDown %s" % dom - #server.xend_node_shutdown() + if not dom is None and dom != '0': + if DEBUG: print ">DomShutDown %s" % dom + try: + server.xend_domain_shutdown( int( dom ), "halt" ) + except: + pass def op_reboot( self, request ): dom = getVar( 'dom', request ) - if not dom is None: - print ">DomReboot %s" % dom - #server.xend_node_reboot() - + if not dom is None and dom != '0': + if DEBUG: print ">DomReboot %s" % dom + try: + server.xend_domain_shutdown( int( dom ), "reboot" ) + except: + pass + def op_pause( self, request ): dom = getVar( 'dom', request ) - if not dom is None: - print ">DomPause %s" % dom - server.xend_domain_pause( int( dom ) ) - + if not dom is None and dom != '0': + if DEBUG: print ">DomPause %s" % dom + try: + server.xend_domain_pause( int( dom ) ) + except: + pass + def op_unpause( self, request ): dom = getVar( 'dom', request ) - if not dom is None: - print ">DomUnpause %s" % dom - server.xend_domain_unpause( int( dom ) ) + if not dom is None and dom != '0': + if DEBUG: print ">DomUnpause %s" % dom + try: + server.xend_domain_unpause( int( dom ) ) + except: + pass + + def op_destroy( self, request ): + dom = getVar( 'dom', request ) + if not dom is None and dom != '0': + if DEBUG: print ">DomDestroy %s" % dom + try: + server.xend_domain_destroy( int( dom ), "halt" ) + except: + pass diff --git a/tools/python/xen/sv/DomList.py b/tools/python/xen/sv/DomList.py index faed020b05..d6e123143e 100755 --- a/tools/python/xen/sv/DomList.py +++ b/tools/python/xen/sv/DomList.py @@ -17,9 +17,14 @@ class DomList( HTMLBase ): def write_BODY( self, request, head=True, long=True ): - domains = map(int, server.xend_domains()) - domains.sort() + domains = None + try: + domains = server.xend_domains() + domains.sort() + except: + pass + request.write( "\n\n" ) if head: @@ -29,28 +34,42 @@ class DomList( HTMLBase ): odd = True - for domain in domains: - if odd: - request.write( "\n" ) - odd = False - else: - request.write( "\n" ) - odd = True - self.write_DOMAIN( request, getDomInfoHash( domain ), long ) - request.write( "\n" ) - + if not domains is None: + for domain in domains: + if odd: + request.write( "\n" ) + odd = False + else: + request.write( "\n" ) + odd = True + self.write_DOMAIN( request, getDomInfoHash( domain ), long ) + request.write( "\n" ) + else: + request.write( "

Error getting domain list
Perhaps XenD not running?

") + request.write( "
\n" ) def write_DOMAIN( self, request, domInfoHash, long=True ): - request.write( "%(dom)-4d\n" % domInfoHash ) + request.write( "%(id)s\n" % domInfoHash ) - url = self.urlWriter( "&mod=info&dom=%(dom)-4d" % domInfoHash ) + url = self.urlWriter( "&mod=info&dom=%(id)s" % domInfoHash ) request.write( "%s\n" % ( url, domInfoHash['name'] ) ) if long: request.write( "%(memory)5s\n" % domInfoHash ) request.write( "%(cpu)2s\n" % domInfoHash ) request.write( "%(state)5s\n" % domInfoHash ) + if domInfoHash[ 'id' ] != "0": + request.write( "" ) + + if domInfoHash[ 'state' ][ 2 ] == "-": + request.write( "" % domInfoHash ) + else: + request.write( "" % domInfoHash ) + + request.write( "" % domInfoHash) + else: + request.write( " " ) def write_DOMAIN_HEAD( self, request, long=True ): request.write( "Domain\n" ) @@ -59,4 +78,4 @@ class DomList( HTMLBase ): request.write( "Memory / Mb\n" ) request.write( "CPU\n" ) request.write( "State\n" ) - + request.write( "\n" ) diff --git a/tools/python/xen/sv/HTMLBase.py b/tools/python/xen/sv/HTMLBase.py index 10d860e0c4..e67784d558 100755 --- a/tools/python/xen/sv/HTMLBase.py +++ b/tools/python/xen/sv/HTMLBase.py @@ -1,4 +1,5 @@ from twisted.web.resource import Resource +from xen.sv.util import * class HTMLBase( Resource ): @@ -28,6 +29,7 @@ class HTMLBase( Resource ): def write_BOTTOM( self, request ): request.write('') + request.write('') request.write('') request.write( "" ) diff --git a/tools/python/xen/sv/Main.py b/tools/python/xen/sv/Main.py index bf6119c600..2362287c50 100755 --- a/tools/python/xen/sv/Main.py +++ b/tools/python/xen/sv/Main.py @@ -4,6 +4,8 @@ from xen.sv.NodeInfo import NodeInfo from xen.sv.DomInfo import DomInfo from xen.sv.CreateDomain import CreateDomain +from xen.xend.XendClient import server + from xen.sv.util import getVar class Main( HTMLBase ): @@ -20,14 +22,18 @@ class Main( HTMLBase ): def render_POST( self, request ): #decide what module post'd the action + + args = getVar( 'args', request ) mod = getVar( 'mod', request ) - if not mod is None: + if not mod is None and args is None: module = self.modules[ mod ] #check module exists if module: - module( self.mainUrlWriter ).perform( request ) + module( self.mainUrlWriter ).perform( request ) + else: + self.perform( request ) return self.render_GET( request ) @@ -80,3 +86,18 @@ class Main( HTMLBase ): request.write( "\n" ) + + def op_destroy( self, request ): + dom = getVar( 'args', request ) + if not dom is None and dom != "0": + server.xend_domain_destroy( int( dom ), "halt" ) + + def op_pause( self, request ): + dom = getVar( 'args', request ) + if not dom is None and dom != "0": + server.xend_domain_pause( int( dom ) ) + + def op_unpause( self, request ): + dom = getVar( 'args', request ) + if not dom is None and dom != "0": + server.xend_domain_unpause( int( dom ) ) \ No newline at end of file diff --git a/tools/python/xen/sv/NodeInfo.py b/tools/python/xen/sv/NodeInfo.py index 948acef4b6..8afc41d491 100755 --- a/tools/python/xen/sv/NodeInfo.py +++ b/tools/python/xen/sv/NodeInfo.py @@ -20,8 +20,12 @@ class NodeInfoTab( GeneralTab ): def __init__( self ): - nodeInfo = sxp2hash( server.xend_node() ) - + nodeInfo = {} + try: + nodeInfo = sxp2hash( server.xend_node() ) + except: + nodeInfo[ 'system' ] = 'Error getting node info' + dictTitles = {} dictTitles[ 'System' ] = 'system' dictTitles[ 'Hostname' ] = 'host' @@ -39,8 +43,11 @@ class NodeInfoTab( GeneralTab ): class NodeDmesgTab( PreTab ): def __init__( self ): - dmesg = server.xend_node_dmesg() - PreTab.__init__( self, dmesg[ 1 ] ) + try: + dmesg = server.xend_node_dmesg() + except: + dmesg = "Error getting node information: XenD not running?" + PreTab.__init__( self, dmesg ) class NodeActionTab( ActionTab ): diff --git a/tools/python/xen/sv/util.py b/tools/python/xen/sv/util.py index b332b60482..3207b8f0cc 100755 --- a/tools/python/xen/sv/util.py +++ b/tools/python/xen/sv/util.py @@ -5,8 +5,12 @@ from xen.xend import PrettyPrint import types def getDomInfoHash( domain ): - domInfoHash = sxp2hash( server.xend_domain( int( domain ) ) ) - domInfoHash['dom'] = int( domain ) + domInfoHash = {} + try: + domInfoHash = sxp2hash( server.xend_domain( domain ) ) + domInfoHash['dom'] = domain + except: + domInfoHash['name'] = "Error getting domain details" return domInfoHash def sxp2hash( s ): diff --git a/tools/sv/Makefile b/tools/sv/Makefile index c7bd3d5880..dcc298826a 100755 --- a/tools/sv/Makefile +++ b/tools/sv/Makefile @@ -33,7 +33,12 @@ install: install -m0644 images/reboot.png $(sv_insdir)/images install -m0644 images/pause.png $(sv_insdir)/images install -m0644 images/unpause.png $(sv_insdir)/images + install -m0644 images/destroy.png $(sv_insdir)/images + install -m0644 images/small-destroy.png $(sv_insdir)/images + install -m0644 images/small-pause.png $(sv_insdir)/images + install -m0644 images/small-unpause.png $(sv_insdir)/images + install -m0644 images/next.png $(sv_insdir)/images install -m0644 images/previous.png $(sv_insdir)/images install -m0644 images/finish.png $(sv_insdir)/images diff --git a/tools/sv/images/destroy.png b/tools/sv/images/destroy.png new file mode 100644 index 0000000000000000000000000000000000000000..9545fc4837b958ef6e146c2c5f21e30258e8d8ad GIT binary patch literal 2408 zcmW+&3pCW(AHTnOV`e-WljqE+)}xY3b*OkTHvM@GUZ7BG^0G0CcHdaRb*QYvXuMV7%Xv1Mx>gW5WS^{}Dkr!|QNp zM7VEw=>DXb*6=L=5WaYMvi%dg1z(qz+|YH3o_j~IaDl$wL__kNw`TF%f@R3V5R|k>+#RL+i|09Q3e`Zp)$g0J4vpJ08|#= zNv@8_$;%Ve$BmMkUf&FPEMR>7cPfO~(A(P^aU5yl`G2tMG!QCNEBh*@^&{oEN4hUc zzC8lGH^v1A2S-Q6#KhPGA2yE9hGI8v{KTR)<6zo`H$)6$!_ay<1CCCfY|f^K4<||~ zil%wP27>`U<AG+%(7q+lK=$sL=B34*( zb@A(b)AY=U4~`%DL{?MNCabE_`c#mWMMN`~;4mWPntcBm(jO<6`ZU9>`Q@r%fFi8S zZb;H7u}04(9-drk^OWn=(oX1I8{z8zyd}F_O<_&_Xq7;usxeg2t4px_y zrTZEp5G+d`(W$;F9JApO;hAOf_^^)Gukp=#Ez4x?Xv#6xf^kjABeJ(6zx~~5dm~kC zSo1nz6GTQxpk?dPOmj=Qc;K9!b)6Gj^sckQV z>ykJP54Pr8VZwB%!HNoV?>r2FVOe&(Jo@wWpjl9owtu5|hAhw3`DA3>#Ui^M{l~27 z%C>ApE%v#?fC`<2^N)s^wIl*R>oo}52`TXeMtw7EVd#17F1^JM0gkV0vwC%^=H*|% zZ7^=Tbo1Aoge?XN$!j} zdj`>4T0UKV4b45sFi|~)j^*^y@XWs@P`*>8>7PK4wWH(Cly;Ww;h;pRL?U7D*pbB! z2%t{#c^1&*dwARecTf}?3RG5ExK02)!Pt^YB7Z`quKvZ@*%?Qp(W2QgQ++PdJX8Io z!>CLg5<7oAW#fr2@r)ZYRO`DeTOFPO+R#8|kR4E(>NFY%CtLz7Pz!ABQRlY~y~;G_ zc~Je+o4ONa$%J8hUX)mhi22g8y~q8ADg1MWI6c-{7Jh8EK-+ps7#S&!%-I$VW# zVhqRb;1upH2s2ro6<%i#@ElsYyG?rkX5iqU4~Uiqx|E$)wi%bYp73_ah9=y(h;@kK z<0nz)d6&zCuR1%Sx^_jvvMS(je@G~V_gcubivwEq8E_z6y29q9SfE82FF>taxiZ=Z zqneX(YL}3w3gL`c{cAy7ZuaWZREQ@z93IX&otF!J-zi_Q*h!R~dyZK`252MJr$}Vps!1#R1^eCaCU9mAdv3fH2p6 zic<9Q_X$ZX+LZt)DAp`Tf}|~EarGj8q;s)&JpSz#+<1bwoyZ51 z$t|C=kARF|*hB>R_3QH46coY?sZ>gb6I#so%@g}EP#sj+z7;!-RTaxS=#9h$Q{f|A@Pr zhQ=+DoSlD9V7juvW0wO0!3?nOOt&pb+j=PS=S&zig;)or2%1!AFDxv$!5@(%hffA? z-Fm=Y7-inTfF!G0;_jgK+ziHM2j}YaH5|L=&1OU8Q)nbuVM8}}e0;n{@rTIN#Va-A zN>vV?354D1&mZ3v`0L*k-?(}jF-mJJ1~IiAU!6B^o`OVvmQen1$n5Z~xY1qJlvXA% zx!wQp#OA&tA9tWqB$kwx_GPRi>#+hOer#%NtN=ZkZ`DP{1?^ooLv(5MG76m6cRyjm zy4p&NRc1_1MqT&N04P0<9OUPB`*cakH=QrQs#4uwAG5Nl+~-0IEgjnFeLc9L__7Lr zKg>!lZFJ5>fJ(gJG1+sEJA@RIcDB9bFq7inQCL(Y#)oH)txBD-uADtKH*UzO{Wh-| ztz&UV(lauK_K_hy7G}8|XwD71eQ>lN(loj8Crl3!(<~d=%XDA7c)@RPRNAr1*9fZ# z!}=Y)%gYU2T5hn8MuGEvUi$j_iKhyXYNGyOn?pp~MVrBuID}g|(aP|`lUEsK8&9lzch?; zcc&`XlU>g2@K`RUeIZP~ZML$sbY(P~!QgV@*jo9zAv~2_qu6wl8fX=R>WQkBHDd0z zoGvVce(F%T54y_j5+HRED$`KkW_*RmVu literal 0 HcmV?d00001 diff --git a/tools/sv/images/small-destroy.png b/tools/sv/images/small-destroy.png new file mode 100644 index 0000000000000000000000000000000000000000..f800bd768599e99d2b41f832aa0c92d922d73b41 GIT binary patch literal 483 zcmV<90UZ8`P)z{!&*89*9A z7^D~=fLMTTas!!SWMsr(U|_(&!NI}s;K2ii$B!Q~01W^;l#~>M zm6a6(H#av}LRndvK}Sc2;m@Bx3{b!X5I{_Pe0(QFL`1-DLk6Ovq6|z-Obq}3{|8zB z1R#KzfWDg!vgYT{pC}4JVjx8z476!JKmalE@bGK~S}}j$zI_aD-@aw|{P{D(rAwC> zu3x_nb_US213-7r1PCA&kUPZ1#Zwk2`|sbsIsgCv&j12UOiT{S z8H9v{7+6_Z84?l_81(h^8LnKpl6vpny%>N1Vgj0${r&rQR!&Y%1`r0B#K_19X0x-i zgZZ~^-AV-rAf`u;9=U-`fLVzQKw=>GfBg7S7a)L`fbL=knLq$A0R#|}prGK1zkmPY zQ~@%Tg@xq_Kmaj`h=@$br3hrxzkmN2xVgFK0|XFrdV2b;A3uJ`1KnZx;>8Pww{PDv z0K*YX1H+U7Xxjl`IFL+k+rh5~@!|yoBO@aN6B84Iii*l?Gc&UcfB<58_wJn;P*L}{Z{IjgO-&gB z0seWGrh*j%ZAra%?_LZ*05RRUb0_=9j~}dTY-|iyu3TaG{rfkAudgqIw6rwC z-@kvsrh*g$1Q4^mz5R5cZXS@pmoHx!9z1veR-~`5&+zHfCx*9g-!lCA^@|@MfS7&CNX@Ab?mnIXOY$ zH2?kk_ldw@VgQB$1JHvEAkTpm0TmzM;NX}E5I`&-lZ1qXQh)yZdFbQEkCCrmzt#ta qCkxOi4}fl83v|v@pxZwI1Q-D0x2PKrYw5%Q0000